home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / AutoComplete.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  8KB  |  231 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''AutoComplete.py - An IDLE extension for automatically completing names.
  5.  
  6. This extension can complete either attribute names of file names. It can pop
  7. a window with all available names, for the user to select from.
  8. '''
  9. import os
  10. import sys
  11. import string
  12. from configHandler import idleConf
  13. import AutoCompleteWindow
  14. from HyperParser import HyperParser
  15. import __main__
  16. FILENAME_CHARS = string.ascii_letters + string.digits + os.curdir + '._~#$:-'
  17. ID_CHARS = string.ascii_letters + string.digits + '_'
  18. (COMPLETE_ATTRIBUTES, COMPLETE_FILES) = range(1, 3)
  19.  
  20. class AutoComplete:
  21.     menudefs = [
  22.         ('edit', [
  23.             ('Show Completions', '<<force-open-completions>>')])]
  24.     popupwait = idleConf.GetOption('extensions', 'AutoComplete', 'popupwait', type = 'int', default = 0)
  25.     
  26.     def __init__(self, editwin = None):
  27.         if editwin == None:
  28.             self.editwin = None
  29.             return None
  30.         
  31.         self.editwin = editwin
  32.         self.text = editwin.text
  33.         self.autocompletewindow = None
  34.         self._delayed_completion_id = None
  35.         self._delayed_completion_index = None
  36.  
  37.     
  38.     def _make_autocomplete_window(self):
  39.         return AutoCompleteWindow.AutoCompleteWindow(self.text)
  40.  
  41.     
  42.     def _remove_autocomplete_window(self, event = None):
  43.         if self.autocompletewindow:
  44.             self.autocompletewindow.hide_window()
  45.             self.autocompletewindow = None
  46.         
  47.  
  48.     
  49.     def force_open_completions_event(self, event):
  50.         '''Happens when the user really wants to open a completion list, even
  51.         if a function call is needed.
  52.         '''
  53.         self.open_completions(True, False, True)
  54.  
  55.     
  56.     def try_open_completions_event(self, event):
  57.         """Happens when it would be nice to open a completion list, but not
  58.         really neccesary, for example after an dot, so function
  59.         calls won't be made.
  60.         """
  61.         lastchar = self.text.get('insert-1c')
  62.         if lastchar == '.':
  63.             self._open_completions_later(False, False, False, COMPLETE_ATTRIBUTES)
  64.         elif lastchar == os.sep:
  65.             self._open_completions_later(False, False, False, COMPLETE_FILES)
  66.         
  67.  
  68.     
  69.     def autocomplete_event(self, event):
  70.         '''Happens when the user wants to complete his word, and if neccesary,
  71.         open a completion list after that (if there is more than one
  72.         completion)
  73.         '''
  74.         if hasattr(event, 'mc_state') and event.mc_state:
  75.             return None
  76.         
  77.         if self.autocompletewindow and self.autocompletewindow.is_active():
  78.             self.autocompletewindow.complete()
  79.             return 'break'
  80.         else:
  81.             opened = self.open_completions(False, True, True)
  82.             if opened:
  83.                 return 'break'
  84.             
  85.  
  86.     
  87.     def _open_completions_later(self, *args):
  88.         self._delayed_completion_index = self.text.index('insert')
  89.         if self._delayed_completion_id is not None:
  90.             self.text.after_cancel(self._delayed_completion_id)
  91.         
  92.         self._delayed_completion_id = self.text.after(self.popupwait, self._delayed_open_completions, *args)
  93.  
  94.     
  95.     def _delayed_open_completions(self, *args):
  96.         self._delayed_completion_id = None
  97.         if self.text.index('insert') != self._delayed_completion_index:
  98.             return None
  99.         
  100.         self.open_completions(*args)
  101.  
  102.     
  103.     def open_completions(self, evalfuncs, complete, userWantsWin, mode = None):
  104.         """Find the completions and create the AutoCompleteWindow.
  105.         Return True if successful (no syntax error or so found).
  106.         if complete is True, then if there's nothing to complete and no
  107.         start of completion, won't open completions and return False.
  108.         If mode is given, will open a completion list only in this mode.
  109.         """
  110.         if self._delayed_completion_id is not None:
  111.             self.text.after_cancel(self._delayed_completion_id)
  112.             self._delayed_completion_id = None
  113.         
  114.         hp = HyperParser(self.editwin, 'insert')
  115.         curline = self.text.get('insert linestart', 'insert')
  116.         i = j = len(curline)
  117.         if hp.is_in_string():
  118.             if not mode or mode == COMPLETE_FILES:
  119.                 self._remove_autocomplete_window()
  120.                 mode = COMPLETE_FILES
  121.                 while i and curline[i - 1] in FILENAME_CHARS:
  122.                     i -= 1
  123.                 comp_start = curline[i:j]
  124.                 j = i
  125.                 while i and curline[i - 1] in FILENAME_CHARS + os.sep:
  126.                     i -= 1
  127.                 comp_what = curline[i:j]
  128.             elif hp.is_in_code():
  129.                 if not mode or mode == COMPLETE_ATTRIBUTES:
  130.                     self._remove_autocomplete_window()
  131.                     mode = COMPLETE_ATTRIBUTES
  132.                     while i and curline[i - 1] in ID_CHARS:
  133.                         i -= 1
  134.                     comp_start = curline[i:j]
  135.                     if i and curline[i - 1] == '.':
  136.                         hp.set_index('insert-%dc' % (len(curline) - i - 1))
  137.                         comp_what = hp.get_expression()
  138.                         if (not comp_what or not evalfuncs) and comp_what.find('(') != -1:
  139.                             return None
  140.                         
  141.                     else:
  142.                         comp_what = ''
  143.                 else:
  144.                     return None
  145.         if complete and not comp_what and not comp_start:
  146.             return None
  147.         
  148.         comp_lists = self.fetch_completions(comp_what, mode)
  149.         if not comp_lists[0]:
  150.             return None
  151.         
  152.         self.autocompletewindow = self._make_autocomplete_window()
  153.         self.autocompletewindow.show_window(comp_lists, 'insert-%dc' % len(comp_start), complete, mode, userWantsWin)
  154.         return True
  155.  
  156.     
  157.     def fetch_completions(self, what, mode):
  158.         '''Return a pair of lists of completions for something. The first list
  159.         is a sublist of the second. Both are sorted.
  160.  
  161.         If there is a Python subprocess, get the comp. list there.  Otherwise,
  162.         either fetch_completions() is running in the subprocess itself or it
  163.         was called in an IDLE EditorWindow before any script had been run.
  164.  
  165.         The subprocess environment is that of the most recently run script.  If
  166.         two unrelated modules are being edited some calltips in the current
  167.         module may be inoperative if the module was not the last to run.
  168.         '''
  169.         
  170.         try:
  171.             rpcclt = self.editwin.flist.pyshell.interp.rpcclt
  172.         except:
  173.             rpcclt = None
  174.  
  175.         if rpcclt:
  176.             return rpcclt.remotecall('exec', 'get_the_completion_list', (what, mode), { })
  177.         elif mode == COMPLETE_ATTRIBUTES:
  178.             if what == '':
  179.                 namespace = __main__.__dict__.copy()
  180.                 namespace.update(__main__.__builtins__.__dict__)
  181.                 bigl = eval('dir()', namespace)
  182.                 bigl.sort()
  183.                 if '__all__' in bigl:
  184.                     smalll = eval('__all__', namespace)
  185.                     smalll.sort()
  186.                 else:
  187.                     smalll = filter((lambda s: s[:1] != '_'), bigl)
  188.             else:
  189.                 
  190.                 try:
  191.                     entity = self.get_entity(what)
  192.                     bigl = dir(entity)
  193.                     bigl.sort()
  194.                     if '__all__' in bigl:
  195.                         smalll = entity.__all__
  196.                         smalll.sort()
  197.                     else:
  198.                         smalll = filter((lambda s: s[:1] != '_'), bigl)
  199.                 return ([], [])
  200.  
  201.         elif mode == COMPLETE_FILES:
  202.             if what == '':
  203.                 what = '.'
  204.             
  205.             
  206.             try:
  207.                 expandedpath = os.path.expanduser(what)
  208.                 bigl = os.listdir(expandedpath)
  209.                 bigl.sort()
  210.                 smalll = filter((lambda s: s[:1] != '.'), bigl)
  211.             except OSError:
  212.                 return ([], [])
  213.             except:
  214.                 None<EXCEPTION MATCH>OSError
  215.             
  216.  
  217.         None<EXCEPTION MATCH>OSError
  218.         if not smalll:
  219.             smalll = bigl
  220.         
  221.         return (smalll, bigl)
  222.  
  223.     
  224.     def get_entity(self, name):
  225.         '''Lookup name in a namespace spanning sys.modules and __main.dict__'''
  226.         namespace = sys.modules.copy()
  227.         namespace.update(__main__.__dict__)
  228.         return eval(name, namespace)
  229.  
  230.  
  231.